%% @author Final
%% @doc @todo Add description to maxteilsummeRek.


-module(maxteilsummeRek).

%% ====================================================================
%% API functions
%% ====================================================================
-export([maxteilsummeRek/1]).



%% ====================================================================
%% Internal functions
%% ====================================================================

cutTail(L) -> lists:sublist(L,length(L)-1).

vonLinksMax(L, Von, Bis) -> vonLinksMax(L, 0, 0, Von, Bis + 1, {0,0}).
vonLinksMax([], Max, _, _, _, VonBis) -> {Max, VonBis};
vonLinksMax(L, Max, Summe, Von, Bis, VonBis) -> case lists:sum(L) > Max of
							  true -> vonLinksMax(cutTail(L), lists:sum(L), Summe + lists:sum(L), Von, Bis - 1, {Von, Bis - 1});
				     		  false -> vonLinksMax(cutTail(L), Max, Summe + lists:sum(L), Von, Bis - 1, VonBis) end.
	
vonRechtsMax([H|T], Von, Bis) -> vonRechtsMax([H|T], 0, 0, Von, Bis, {0,0}).
vonRechtsMax([], Max1, _, _, _, VonBis) -> {Max1, VonBis};
vonRechtsMax([H|T], Max1, Summe1, Von, Bis, VonBis) -> case lists:sum([H|T]) > Max1 of
							  true -> vonRechtsMax(T, lists:sum([H|T]), Summe1 + lists:sum([H|T]), Von + 1, Bis, {Von, Bis});
				     		  false -> vonRechtsMax(T, Max1, Summe1 + lists:sum([H|T]), Von + 1, Bis, VonBis) end.


maxteilsummeRek([]) -> {0, 0, 0};
maxteilsummeRek(L) -> maxteilsummeRek(L, 1, length(L)).
maxteilsummeRek(L, Von, Bis) -> if length(L) =:= 1 -> {max(hd(L),0), Von, Bis};
						true -> maxteilsummeRek(hd(splitList(L)), lists:flatten(tl(splitList(L))), Von, Bis) end.
maxteilsummeRek(H, T, Von, Bis) ->
		{Sum2, Von2, Bis2} = maxteilsummeRek(T, Von + length(H), Bis),
		{Sum1,Von1,Bis1} = maxteilsummeRek(H, Von, Bis - length(T)),
		{MaxR, {VonR,_}} = vonRechtsMax(H, Von, Bis - length(T)),
		{MaxL, {_,BisL}} = vonLinksMax(T, Von + length(H), Bis),
		SumM = MaxR + MaxL,
	    if 
		   (Sum1 >= Sum2) and (Sum1 >= SumM) -> SumErg = Sum1, VonErg = Von1, BisErg = Bis1;
		   (Sum2 >= Sum1) and (Sum2 >= SumM) -> SumErg = Sum2, VonErg = Von2, BisErg = Bis2;
		   (SumM >= Sum2) and (SumM >= Sum1) -> SumErg = SumM, VonErg = VonR, BisErg = BisL
		end,
		{SumErg,VonErg,BisErg}.
							
splitList(L) -> tuple_to_list(lists:split(round(length(L)/2), L)).		
